package com.smart.community.commons.utils;

import cn.dev33.satoken.stp.StpUtil;
import com.smart.community.commons.enums.RoleCodeEnum;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;

/**
 * 简化权限检查工具类
 * 仅保留菜单级权限控制，移除细粒度权限检查（按钮级、方法级）
 * @author Wu.Liang
 * @since 2025-07-02
 */
@Slf4j
public class PermissionUtils {

    /**
     * 检查当前用户是否具有菜单权限
     * @param menuCode 菜单编码
     * @return 是否具有菜单权限
     */
    public static boolean hasMenuPermission(String menuCode) {
        try {
            if (menuCode == null || menuCode.trim().isEmpty()) {
                return false;
            }
            // 超级管理员拥有所有菜单权限
            if (isCurrentUserSuperAdmin()) {
                // 超级管理员拥有所有菜单权限 - 已隐藏详细日志
                return true;
            }
            // 这里可以根据实际业务角色-菜单映射关系扩展
            return getCurrentUserMenuPermissions().contains(menuCode);
        } catch (Exception e) {
            log.error("检查菜单权限{}失败", menuCode, e);
            return false;
        }
    }

    /**
     * 获取当前用户的菜单权限列表
     * @return 菜单权限列表
     */
    public static List<String> getCurrentUserMenuPermissions() {
        try {
            // 示例：根据角色返回对应的菜单权限
            List<String> roles = getCurrentUserRoles();
            if (roles.contains(RoleCodeEnum.SUPER_ADMIN.getCode())) {
                return Arrays.asList("user:menu", "region:menu", "property:menu", "parking:menu", "security:menu");
            }
            // 其他角色可根据实际业务扩展
            // 默认允许访问部分菜单
            return Arrays.asList("user:menu", "region:menu");
        } catch (Exception e) {
            log.error("获取当前用户菜单权限列表失败", e);
            return Arrays.asList();
        }
    }

    /**
     * 获取当前用户的角色列表
     * @return 角色列表
     */
    public static List<String> getCurrentUserRoles() {
        try {
            // Sa-Token API调用，返回当前用户的角色列表
            Object roleList = StpUtil.getSession().get("roleList");
            if (roleList instanceof List) {
                return (List<String>) roleList;
            }
            // 如果session中没有角色信息，返回默认角色
            return Arrays.asList(RoleCodeEnum.NORMAL_USER.getCode());
        } catch (Exception e) {
            log.error("获取当前用户角色列表失败", e);
            return Arrays.asList(RoleCodeEnum.NORMAL_USER.getCode());
        }
    }

    /**
     * 检查当前用户是否为超级管理员
     * @return 是否为超级管理员
     */
    public static boolean isCurrentUserSuperAdmin() {
        try {
            return getCurrentUserRoles().contains(RoleCodeEnum.SUPER_ADMIN.getCode());
        } catch (Exception e) {
            log.error("检查超级管理员权限失败", e);
            return false;
        }
    }

    /**
     * 断言当前用户具有菜单权限
     * @param menuCode 菜单编码
     * @throws RuntimeException 如果用户没有菜单权限
     */
    public static void requireMenuPermission(String menuCode) {
        if (!hasMenuPermission(menuCode)) {
            throw new RuntimeException("菜单权限不足：" + menuCode);
        }
    }

    /**
     * 断言当前用户为超级管理员
     * @throws RuntimeException 如果用户不是超级管理员
     */
    public static void requireSuperAdmin() {
        if (!isCurrentUserSuperAdmin()) {
            throw new RuntimeException("需要超级管理员权限");
        }
    }

    /**
     * 断言当前用户已登录
     * @throws RuntimeException 如果用户未登录
     */
    public static void requireLogin() {
        if (!StpUtil.isLogin()) {
            throw new RuntimeException("用户未登录");
        }
    }
}
